#!/usr/bin/env python
"""
Usage:
$ python -m venv .venv
$ source .venv/bin/activate
$ pip install -r requirements-testing.txt -r requirements.txt
$ python ./quicktest.py
"""

import argparse
import django
from django.conf import settings
import os
import sys

print(f"Running tests using Django version {django.get_version()}...")


class QuickDjangoTest:
    """
    A quick way to run the Django test suite without a fully-configured project.

    Example usage:

        >>> QuickDjangoTest('app1', 'app2')

    Based on a script published by Lukasz Dziedzia at:
    http://stackoverflow.com/questions/3841725/how-to-launch-tests-for-django-reusable-app
    """

    DIRNAME = os.path.dirname(__file__)
    INSTALLED_APPS = (
        "django.contrib.admin",
        "django.contrib.auth",
        "django.contrib.contenttypes",
        "django.contrib.humanize",
        "django.contrib.messages",
        "django.contrib.sessions",
        "django.contrib.sites",
        "django.contrib.staticfiles",
        "bootstrap4form",
        #  The following commented apps are optional,
        #  related to teams functionalities
        # 'account',
        # 'pinax.invitations',
        # 'pinax.teams',
        "rest_framework",
        "helpdesk",
        # 'reversion',
    )
    MIDDLEWARE = [
        "django.middleware.security.SecurityMiddleware",
        "django.contrib.sessions.middleware.SessionMiddleware",
        "django.middleware.common.CommonMiddleware",
        "django.middleware.csrf.CsrfViewMiddleware",
        "django.contrib.auth.middleware.AuthenticationMiddleware",
        "django.contrib.messages.middleware.MessageMiddleware",
        "django.middleware.clickjacking.XFrameOptionsMiddleware",
    ]

    TEMPLATES = [
        {
            "BACKEND": "django.template.backends.django.DjangoTemplates",
            "APP_DIRS": True,
            "OPTIONS": {
                "context_processors": (
                    # Defaults:
                    "django.contrib.auth.context_processors.auth",
                    "django.template.context_processors.debug",
                    "django.template.context_processors.i18n",
                    "django.template.context_processors.media",
                    "django.template.context_processors.static",
                    "django.template.context_processors.tz",
                    "django.contrib.messages.context_processors.messages",
                    # Our extra:
                    "django.template.context_processors.request",
                ),
            },
        },
    ]

    def __init__(self, *args, **kwargs):
        self.tests = args
        self.kwargs = kwargs or {"verbosity": 1}
        self._tests()

    def _tests(self):
        settings.configure(
            DEBUG=True,
            TIME_ZONE="UTC",
            DATABASES={
                "default": {
                    "ENGINE": "django.db.backends.sqlite3",
                    "NAME": os.path.join(self.DIRNAME, "database.db"),
                    "USER": "",
                    "PASSWORD": "",
                    "HOST": "",
                    "PORT": "",
                }
            },
            INSTALLED_APPS=self.INSTALLED_APPS,
            MIDDLEWARE=self.MIDDLEWARE,
            ROOT_URLCONF="tests.urls",
            STATIC_URL="/static/",
            LOGIN_URL="/login/",
            TEMPLATES=self.TEMPLATES,
            SITE_ID=1,
            SECRET_KEY="wowdonotusethisfakesecuritykeyyouneedarealsecure1",
            # The following settings disable teams
            HELPDESK_TEAMS_MODEL="auth.User",
            HELPDESK_TEAMS_MIGRATION_DEPENDENCIES=[],
            HELPDESK_KBITEM_TEAM_GETTER=lambda _: None,
            # Set IMAP Server Debug Verbosity
            HELPDESK_IMAP_DEBUG_LEVEL=int(
                os.environ.get("HELPDESK_IMAP_DEBUG_LEVEL", "0")
            ),
        )

        from django.test.runner import DiscoverRunner

        test_runner = DiscoverRunner(verbosity=self.kwargs["verbosity"])
        django.setup()

        failures = test_runner.run_tests(self.tests)
        if failures:
            sys.exit(failures)


if __name__ == "__main__":
    """
    What do when the user hits this file from the shell.

    Example usage:

        $ python quicktest.py test1 test2

    """
    parser = argparse.ArgumentParser(usage="[args]", description="Run Django tests.")
    parser.add_argument("tests", nargs="*", type=str)
    parser.add_argument("--verbosity", "-v", nargs="?", type=int, default=1)
    args = parser.parse_args()
    if not args.tests:
        args.tests = ["."]
    QuickDjangoTest(*args.tests, verbosity=args.verbosity)
